package model;

import java.sql.Date;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import entidade.Fatura;

@SuppressWarnings("serial")
public class FaturaTableModel extends AbstractTableModel {

	// constantes que v�o representar as colunas
	// (s� para facilitar o entendimento do c�digo)
	private final int COL_CODIGO = 0;
	private final int COL_DTCOMPRA = 1;
	private final int COL_CARTAO = 2;
	private final int COL_HISTORICO = 3;
	private final int COL_VALOR = 4;
	private final int COL_FATURA = 5;
	private final int COL_DTPAGAMENTO = 6;

	// lista dos itens que ser�o exibidos
	private List<Fatura> faturas;
	private DecimalFormat df;

	public FaturaTableModel() {
		faturas = new ArrayList<>();
		df = new DecimalFormat("###,##0.00");
	}

	public FaturaTableModel(List<Fatura> lista) {
		this();
		faturas.addAll(lista);
		df = new DecimalFormat("###,##0.00");
	}

	public int getRowCount() {
		// cada produto na lista ser� uma linha
		return faturas.size();
	}

	public int getColumnCount() {
		// vamos exibir s� Nome e Quantidade, ent�o s�o 2 colunas
		return 7;
	}

	@Override
	public String getColumnName(int column) {
		// qual o nome da coluna
		switch (column) {
		case COL_CODIGO:
			return "C\u00F3digo";
		case COL_DTCOMPRA:
			return "Compra";
		case COL_CARTAO:
			return "Cart\u00E3o";
		case COL_HISTORICO:
			return "Hist\u00F3rico";
		case COL_VALOR:
			return "Valor";
		case COL_FATURA:
			return "Refer\u00EAncia";
		case COL_DTPAGAMENTO:
			return "Pagamento";
		}
		return "";
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// retorna a classe que representa a coluna
		switch (columnIndex) {
		case COL_CODIGO:
			return Integer.class;
		case COL_DTCOMPRA:
			return Date.class;
		case COL_CARTAO:
			return String.class;
		case COL_HISTORICO:
			return String.class;
		case COL_VALOR:
			return String.class;
		case COL_FATURA:
			return String.class;
		case COL_DTPAGAMENTO:
			return Date.class;
		}
		return String.class;
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		// pega o produto da linha
		Fatura f = faturas.get(rowIndex);

		// verifica qual valor deve ser retornado
		switch (columnIndex) {
		case COL_CODIGO:
			return f.getCodigo();
		case COL_DTCOMPRA:
			return f.getDtCompra();
		case COL_CARTAO:
			return f.getCartao().getTermino();
		case COL_HISTORICO:
			return f.getHistorico();
		case COL_VALOR:
			return df.format(f.getValor());
		case COL_FATURA:
			return f.getReferencia();
		case COL_DTPAGAMENTO:
			return f.getDtPagamento();
		}
		return "";
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		// pega o produto da linha
		Fatura f = faturas.get(rowIndex);

		// verifica qual valor vai ser alterado
		switch (columnIndex) {
		case COL_CODIGO:
			f.setCodigo(Integer.parseInt(aValue.toString()));
		case COL_DTCOMPRA:
			f.setDtCompra(Date.valueOf(aValue.toString()));
		case COL_CARTAO:
			f.getCartao().setTermino(aValue.toString());
		case COL_HISTORICO:
			f.setHistorico(aValue.toString());
		case COL_VALOR:
			f.setValor(Float.valueOf(aValue.toString()));
		case COL_FATURA:
			f.setReferencia(aValue.toString());
		case COL_DTPAGAMENTO:
			f.setDtPagamento(Date.valueOf(aValue.toString()));
		}

		// avisa que os dados mudaram
		fireTableDataChanged();
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		// no nosso caso todas v�o ser edit�veis, entao retorna true pra todas
		return false;
	}

	public Fatura get(int pos) {
		return faturas.get(pos);
	}

}
